package com.distribuida.servidor;
import java.util.ArrayList;

import com.distribuida.supertrunfo.comum.Jogador;
import com.distribuida.supertrunfo.impl.Jogo;
import com.distribuida.supertrunfo.impl.SuperTrunfo;


public class Servidor {

	private static Servidor instance;
	public  ArrayList<Jogo> 	jogos;
	public 	ArrayList<Jogador>	jogadores;
	private static String caminhoXML = "C:\\Users\\Notebook\\Downloads\\arv\\arv.xml";
	public int porta = 1099;
	private int ultimoJogoDisponivel = 0;

	protected Servidor(){
		super();
		jogos = new ArrayList<Jogo>();
                jogadores = new ArrayList<Jogador>();
	}


	public static Servidor getInstance(){
		if(instance == null){
			try{
				instance = new Servidor();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return instance;
	}

	public  ArrayList<Jogo> getJogos() {
		return jogos;
	}
	public void setJogos(ArrayList<Jogo> jogos) {
		this.jogos = jogos;
	}

	
	public Jogo getJogoPorId(int id) throws Exception{
		for(Jogo jogo : jogos){
			if(jogo.getId() == id){
				return jogo;
			}
		}
		throw new Exception("Jogo inexistente!");
	}

	public Jogo BuscarJogoDisponivel(){
		Jogo jogo = null;
		for(Jogo jog : jogos){
			if(jog.getJogadores().size() < 4 && !jog.isJogoEmAndamento()){
				jogo = jog;
			}
		}
		if(jogo == null){
			jogo = new Jogo(new SuperTrunfo(caminhoXML));
			jogos.add(jogo);
			ultimoJogoDisponivel = jogos.indexOf(jogo);
		}
		return jogo;
	}
	
	public int RegistroJogador(String nome) throws Exception{
		Jogador jog = buscarJogadorPorNome(nome);
		if(jog == null){
			System.out.println("Jogador sem o pre registro!");
			return -1;
		}else{
			Jogo jogo = BuscarJogoDisponivel();
			if(jogo.adicionarJogador(jog))
				return jog.getId();
			else
				return -1;
		}
	}
	
	public int preRegistroJogador(String nome, int id){
		if(buscarJogadorPorNome(nome) != null){
			System.out.println("Ja existe um usuario com este nome!");
			return -1;
		}
		Jogador jogador = new Jogador(nome, id);
		jogadores.add(jogador);
		return 0;
	}
	
	public int removerJogador(int id) throws Exception{
		return getJogoPorId(buscarJogadorPorID(id).getId_jogo()).removerJogador(id) && jogadores.remove(buscarJogadorPorID(id))? 0:-1;
	}
	
	public Jogador buscarJogadorPorNome(String nome){
		Jogador jog = null;
		for(Jogador joga: jogadores){
			if(joga.getNome().equalsIgnoreCase(nome)){
				jog = joga;
				return jog;
			}
		}
		return jog;
	}

	public Jogador buscarJogadorPorID(int id){
		Jogador jog = null;
		for(Jogador joga: jogadores){
			if(joga.getId() == id){
				jog = joga;
				return jog;
			}
		}
		return jog;
	}	

	public int getUltimoJogoDisponivel() {
		return ultimoJogoDisponivel;
	}


	public void setUltimoJogoDisponivel(int ultimoJogoDisponivel) {
		this.ultimoJogoDisponivel = ultimoJogoDisponivel;
	}

}












